package com.dji.sdk.mqtt.requests;

import com.dji.sdk.cloudapi.config.RequestsConfigRequest;
import com.dji.sdk.cloudapi.flightarea.FlightAreasGetRequest;
import com.dji.sdk.cloudapi.map.OfflineMapGetRequest;
import com.dji.sdk.cloudapi.media.StorageConfigGet;
import com.dji.sdk.cloudapi.organization.AirportBindStatusRequest;
import com.dji.sdk.cloudapi.organization.AirportOrganizationBindRequest;
import com.dji.sdk.cloudapi.organization.AirportOrganizationGetRequest;
import com.dji.sdk.cloudapi.wayline.FlighttaskResourceGetRequest;
import com.dji.sdk.mqtt.ChannelName;

import java.util.Arrays;

/**
 * 请求方法枚举类。
 * 定义了所有支持的MQTT请求方法，并将每种方法映射到对应的频道名和请求数据类型。
 * 当MQTT消息到达时，根据消息中的method字段选择对应的处理通道和数据类型。
 * 
 * @author sean
 * @version 1.0
 * @date 2022/5/25
 */
public enum RequestsMethodEnum {

    /**
     * 获取存储配置请求
     */
    STORAGE_CONFIG_GET("storage_config_get", ChannelName.INBOUND_REQUESTS_STORAGE_CONFIG_GET, StorageConfigGet.class),

    /**
     * 机场绑定状态请求
     * 用于查询设备是否已经绑定到组织，在设备上线后执行
     */
    AIRPORT_BIND_STATUS("airport_bind_status", ChannelName.INBOUND_REQUESTS_AIRPORT_BIND_STATUS, AirportBindStatusRequest.class),

    /**
     * 机场组织绑定请求
     * 用于将设备绑定到特定组织，在确认设备未绑定后执行
     */
    AIRPORT_ORGANIZATION_BIND("airport_organization_bind", ChannelName.INBOUND_REQUESTS_AIRPORT_ORGANIZATION_BIND, AirportOrganizationBindRequest.class),

    /**
     * 获取机场所属组织请求
     * 用于根据绑定码查询组织信息
     */
    AIRPORT_ORGANIZATION_GET("airport_organization_get", ChannelName.INBOUND_REQUESTS_AIRPORT_ORGANIZATION_GET, AirportOrganizationGetRequest.class),

    /**
     * 获取飞行任务资源请求
     */
    FLIGHT_TASK_RESOURCE_GET("flighttask_resource_get", ChannelName.INBOUND_REQUESTS_FLIGHTTASK_RESOURCE_GET, FlighttaskResourceGetRequest.class),

    /**
     * 配置请求，用于License校验和配置获取
     * 该方法在设备连接后首先调用，用于验证设备License和获取应用配置
     * 如果License验证失败，将导致后续的组织绑定流程无法进行
     * 使用Topic: thing/product/{gateway_sn}/requests, Method: config
     */
    CONFIG("config", ChannelName.INBOUND_REQUESTS_CONFIG, RequestsConfigRequest.class),

    /**
     * 获取飞行区域请求
     */
    FLIGHT_AREAS_GET("flight_areas_get", ChannelName.INBOUND_REQUESTS_FLIGHT_AREAS_GET, FlightAreasGetRequest.class),

    /**
     * 获取离线地图请求
     */
    OFFLINE_MAP_GET("offline_map_get", ChannelName.INBOUND_REQUESTS_OFFLINE_MAP_GET, OfflineMapGetRequest.class),

    /**
     * 未知请求类型，用于处理不支持的请求方法
     */
    UNKNOWN("", ChannelName.DEFAULT, Object.class);

    /**
     * 方法名称
     */
    private final String method;

    /**
     * 对应的MQTT通道名称
     */
    private final String channelName;

    /**
     * 对应的请求数据类型
     */
    private final Class classType;

    RequestsMethodEnum(String method, String channelName, Class classType) {
        this.method = method;
        this.channelName = channelName;
        this.classType = classType;
    }

    public String getMethod() {
        return method;
    }

    public String getChannelName() {
        return channelName;
    }

    public Class getClassType() {
        return classType;
    }

    /**
     * 根据方法名称查找对应的枚举值
     * 
     * @param method 方法名称
     * @return 对应的RequestsMethodEnum枚举值，如果未找到则返回UNKNOWN
     */
    public static RequestsMethodEnum find(String method) {
        return Arrays.stream(RequestsMethodEnum.values())
                .filter(methodEnum -> methodEnum.method.equals(method))
                .findAny().orElse(UNKNOWN);
    }
}
